
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;

/**
 * <p>
 * Descricao do estado e do comportamento de Motor de Elevador.
 * </p>
 */
class Motor extends Thread {

  ///////////////////////////////////////
  // attributes


/**
 * <p>
 * Representa o temporizador que vai contar o tempo de movimento do
 * Elevador entre dois andares consecutivos.
 * </p>
 */
    private Object temporizador; 

/**
 * <p>
 * Indica se o Motor esta' funcionando.
 * </p>
 */
    private boolean ligado; 

/**
 * <p>
 * Representa a direcao em que se movimento o Elevador.
 * </p>
 */
    private int direcao; 

   ///////////////////////////////////////
   // associations

/**
 * <p>
 * Referencia o Elevador do qual o Motor e' parte integrante.
 * </p>
 */
    protected Elevador elevador; 


  ///////////////////////////////////////
  // operations


/**
 * <p>
 * Cria uma instancia de Motor.
 * </p>
 * 
 * @return uma instancia de Motor.
 * 
 * @param direcao - direcao inicial de movimento do Elevador.
 * 
 * @param elevador - Elevador ao qual esta' integrado o Motor.
 */
    public  Motor(int direcao, Elevador elevador) {        
        this.direcao = direcao;
        this.elevador = elevador;
        ligado = false;
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                desligar();
            }
        };
        Timer temporizador = new Timer(Controlador.deslocamentoAndar,taskPerformer);
        this.temporizador = temporizador;
    } // end Motor        

/**
 * <p>
 * Aciona o Motor para movimentar o Elevador em uma particular direcao. O
 * Motor so' e' acionado de fato se a Porta estiver fechada. Se vier a
 * mensagem ligar e a Porta estiver aberta, entao o Motor fica no aguardo
 * do fechamento da Porta.
 * </p>
 * 
 * @param direcao - direcao de movimento do Elevador.
 */
    public void ligar(int direcao) {        
        Timer temporizador = (Timer)this.temporizador;
        boolean portaAberta = true;
        try {
            while (portaAberta)
                if (elevador.isPortaFechada()) 
                	portaAberta = false;
                else 
                	wait();
            this.direcao = direcao;
            if (temporizador.isRunning())
                temporizador.restart();        /** Motor ja' ligado - temporizar reiniciado */
            else {
                ligado = true;
                temporizador.start();
            }
        } catch (InterruptedException e) { }
    } // end ligar        

/**
 * <p>
 * Desliga o Motor.
 * </p>
 */
    public void desligar() {        
        ligado = false;
        ((Timer)temporizador).stop();
        elevador.registrarMotorDesligado();
    } // end desligar        

/**
 * <p>
 * Informa se o Motor esta' ligado.
 * </p>
 * 
 * @return true se Motor ligado.
 */
    public boolean isLigado() {        
        return ligado;
    } // end isLigado        

/**
 * Does ...
 * 
 */
    public void run() {        
        // your code here
    } // end run        

 } // end Motor



